<?php

class SQL_Dump_Importer
{
	private $con; // sql connection

	private $data; // Die Daten
	private $fp=0; // File Pointer
	
	public function __construct ($host, $user, $pass, $db)
	{
		$this->con = mysql_connect($host, $user, $pass);
		mysql_select_db($db);
	}
	
	public function importFile($filename)
	{
		$this->data = file_get_contents($filename);
		$this->fp=0;
		while (($query = $this->getNextQuery()) !== false)
		{
			$r = mysql_query($query);
			if (!$r)
			{
				die('Import Error - SQL Query failed: ' .$query ."\n==============\n" . mysql_error());
			}
		}
		// eof
	}
	
	private function getNextQuery()
	{
		// wir sind definitiv am Anfang einer neuen Zeile
		while ($this->isComment())
		{
			// diese Zeile überspringen
			$this->goToNextLine();
		}

		// dann kann gearbeitet werden
		$query = "";
		$quote_offen = false;
		while (($b = $this->read()) !== false)
		{
			$query.=$b;
			if ($b == '\'' || $b == '"')
			{
				// Achtung: quote
				// gucken ob auskommentiert
				if (
					$this->read(-2) != "\\"
					|| ($this->read(-2) == "\\" && $this->read(-3) == "\\")
				) {
					// (wahrscheinlich) nicht auskommentiert
					if ($quote_offen === false)
					{
						$quote_offen = $b;
					} else
					{
						// aber nur schließen wenn das das offene zeichen ist
						if ($b == $quote_offen)
						{
							$quote_offen = false;
						}
					}
				}
			}
			// Ende suchen
			if ($quote_offen === false && $b == ';')
			{
				// Hier ist das Ende des querys
				$this->goToNextLine();
				return $query;
			}
		}
		
		//eof
		return false;
	}
	
	private function goToNextLine()
	{
		while ($this->read() != "\n")
		{
			if ($this->eof())
			{
				return;
			}
		}
	}
	
	private function isComment()
	{
		if ($this->read(0) == '-')
		{
			return true;
		} else
		{
			return false;
		}
	}
	
	// optional den index
	private function eof($idx=false)
	{
		if ($idx === false)
		{
			$idx = $this->fp;
		}
		if ($idx < 0 || $idx >= strlen($this->data))
		{
			return true;
		} else
		{
			return false;
		}
	}
	
	// read und eins weiter wenn kein offset gesetzt
	private function read($offset=false)
	{
		$idx = $this->fp + (int) $offset;
		if ($this->eof($idx))
		{
			return false;
		}
		$c = $this->data[$idx];
		if ($offset===false)
		{
			$this->fp++;
		}
		return $c;
	}
}

